package main

//函数式编程:函数是Go语言中的一等公民

func main() {
	//funcAsVariable()

	//localFunc()

	//adder := funcAsReturnValue()
	//sum := adder(10, 9)
	//println("sum = ", sum)

	anonymousFuncAndInvoke()
}

func add(a, b int) int {
	return a + b
}

// 将方法赋值给变量
func funcAsVariable() {
	//将方法赋值给变量
	//它本质上还是一个变量,只是变量的类型是方法
	addVar := add

	//可以通过变量直接发起调用
	sum := addVar(1, 2)
	println("sum = ", sum)
}

// 声明局部方法,它的作用域就在当前方法内
func localFunc() {
	//声明局部方法addFunc,它仅能在当前方法内被使用
	addFunc := func(a, b int) int {
		return a + b
	}

	//调用局部方法
	sum := addFunc(3, 4)
	println("sum = ", sum)

}

// 方法作为返回值
func funcAsReturnValue() func(a, b int) int {
	return func(a, b int) int {
		return a + b
	}
}

// 定义匿名方法,并直接发起调用
func anonymousFuncAndInvoke() {
	//定义一个匿名方法,并直接发起调用
	//这种方式在defer中使用得比较多
	sum := func(a, b int) int {
		return a + b
	}(6, 18)
	println("sum = ", sum)
}
